package com.java.throwable;

/**
 * try-catch-finally
 */
public class TryCatchFinally {
    public static void func1() {
        System.out.println("方法开始");
        try {
            Integer integer = 10 / 0; // 无catch捕获处理的异常导致整个程序被终止
        } finally { // try后无catch时则必须要finally
            System.out.println("必定执行Finally");
        }
        System.out.println("方法结束");
        
        // 发生异常前 必定执行Finally
    }
    
    public static void func2() {
        System.out.println("方法开始");
        try {
            System.out.println("异常抛出Try前");
            Integer integer = 10 / 0; // try中抛出异常语句后的代码不会被执行，而是直接进入catch
            System.out.println("异常抛出Try后");
        } catch (ArithmeticException | IndexOutOfBoundsException e) { // 多异常在同catch内被捕获
            System.out.println("异常捕获Catch子");
            e.getMessage(); // 获取错误信息
            e.printStackTrace(); // 打印错误信息到控制台，只是打印无其他副作用
        } catch (RuntimeException e) { // 父异常的捕获后于子异常
            System.out.println("异常捕获Catch父");
        } finally {
            System.out.println("必定执行Finally");
        }
        
        // 执行到此表示被catch捕获处理的异常不会导致整个程序被终止，只是终止try内代码
        System.out.println("方法结束");
        
        // 方法开始 异常抛出Try前 异常捕获Catch子 必定执行Finally 方法结束
    }
    
    public static Integer func3() {
        Integer integer = 10;
        try {
            integer = integer / 0;
            return integer; // 该return语句不会被执行
        } catch (ArithmeticException e) {
            integer = 20;
            return integer; // 等finally执行完且无终止语句则执行变量被替换为常量的return 20语句
        } finally {
            integer = 30;
            
            // 注解被放开则到此结束，注解不放开则回到catch
            // return integer;
        }
    }
    
    public static void main(String[] args) {
        // 此处注解放开程序将终止于func1函数内
        // func1();
        
        func2();
        
        // 放开finally内注解返回30，未放开finally内注解返回20
        System.out.println(func3());
    }
}
